import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from typing import List, Union, Optional
import pandas as pd
import numpy as np
from matplotlib.font_manager import FontProperties

font_path = 'C:/Windows/Fonts/msyh.ttc'
font_prop = FontProperties(fname=font_path)


def plot_sensor_time_series(
    x: Union[pd.DatetimeIndex, np.ndarray, List[Union[str, pd.Timestamp]]],
    y: Union[List[np.ndarray], List[List[float]]],
    title: str = "",
    xlabel: str = "",
    ylabel: str = "",
    labels: Optional[List[str]] = None,
    colors: Optional[List[str]] = None,
    figsize: tuple = (12, 6),
    date_format: str = "%Y-%m-%d %H:%M",
    grid: bool = True
) -> plt.Figure:

# ---------------------- 数据校验与预处理 ----------------------

    # 确保 y 是列表且至少有一组数据
    if not isinstance(y, list) or len(y) == 0:
        raise ValueError("y 必须是包含至少一组数据的列表（如 [y1, y2, ...]）")
    
    # 统一 x 为 pandas.DatetimeIndex（兼容多种输入类型）
    if not isinstance(x, pd.DatetimeIndex):
        x = pd.to_datetime(x)  # 自动转换字符串/时间戳为 DatetimeIndex
    
    # 检查每组 y 的长度是否与 x 一致
    for i, y_series in enumerate(y):
        if len(y_series) != len(x):
            raise ValueError(f"第 {i+1} 组 y 数据长度（{len(y_series)}）与 x 长度（{len(x)}）不一致")
    
    # 自动生成图例标签（若未提供）
    if labels is None:
        labels = [f"Series {i+1}" for i in range(len(y))]
    elif len(labels) != len(y):
        print(len(labels), len(y))
        # raise ValueError("labels 长度必须与 y 的组数一致")
    
    # 自动生成颜色（若未提供）
    if colors is None:
        colors = plt.rcParams["axes.prop_cycle"].by_key()["color"]  # 使用默认颜色循环
    elif len(colors) != len(y):
        print(len(colors), len(y))
        # raise ValueError("colors 长度必须与 y 的组数一致")
    
    # ---------------------- 绘图初始化 ----------------------
    fig, ax = plt.subplots(figsize=figsize)
    
    # ---------------------- 绘制每组折线 ----------------------
    for i, (y_series, label, color) in enumerate(zip(y, labels, colors)):
        ax.plot(
            x, 
            y_series, 
            label=label, 
            color=color, 
            linewidth=1.5,  # 折线宽度
            marker='',      # 无标记点（可根据需求改为 'o'/'s' 等）
            linestyle='-'   # 实线（可改为 '--' 表示虚线）
        )
    
    # ---------------------- 图表美化 ----------------------
    # 设置标题、坐标轴标签
    plt.title(title, fontsize=14, fontweight='bold',fontproperties=font_prop)
    plt.xlabel(xlabel, fontsize=12,fontproperties=font_prop)
    plt.ylabel(ylabel, fontsize=12,fontproperties=font_prop)
    
    # 设置 x 轴时间格式
    ax.xaxis.set_major_formatter(mdates.DateFormatter(date_format))
    fig.autofmt_xdate()  # 自动旋转日期标签避免重叠
    
    # 设置网格
    if grid:
        ax.grid(True, linestyle='--', alpha=0.7)
    
    # 添加图例
    plt.legend(fontsize=10, loc='best',prop=font_prop)  # loc='best' 自动选择最佳位置
    
    # 调整布局（避免标签被截断）
    plt.tight_layout()
    
    return fig



